// Copyright 2010 Google Inc.
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//      http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------

#ifndef _COMMANDLINEFLAGS_H_
#define _COMMANDLINEFLAGS_H_

#include <string>
#include <vector>
#include <gflags/gflags.h>

using namespace std;


void ProcessCommandLineArguments(int& argc, char**& argv);


// ----------------------------------------------------------------------------
// Handling of post-static-initialization startup code.


// Registration of initialization code to be performed after main() is entered.
// If the initialization code included "REQUIREMODULE_INITIALIZED(name)",
// that one must be done before this one.  The dependencies must form a DAG;
// cycles will cause initialization to hang.

#define REGISTER_MODULE_INITIALIZER(name, code)              \
  namespace {                                                \
    void ModuleInitializer() { code; }                       \
    int module_init_dummy =                                  \
      RegisterModuleInitializer(#name, &ModuleInitializer);  \
  }

#define REQUIRE_MODULE_INITIALIZED(name)                     \
  InitializeOneModule(#name)

int RegisterModuleInitializer(const char* name, void (*init)());

void InitializeOneModule(const char* name);
void InitializeAllModules();


#endif  // _COMMANDLINEFLAGS_H_
